home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-02-12 | 5.0 KB | 182 lines | [TEXT/Mrls] |
- module: dylan-user
- author: Patrick C. Beard <beard@cs.ucdavis.edu>
- description: Implements class <window>.
-
- define class <text-style> (<object>)
- slot font-name :: <string>,
- init-value: #f,
- init-keyword: name:;
- slot font-size :: <small-integer>,
- init-value: #f,
- init-keyword: size:;
- slot font-face :: <small-integer>,
- init-value: #f,
- init-keyword: face:;
- end class <text-style>;
-
- // constants useful for specifying a text face.
- define constant $bold = 1;
- define constant $italic = 2;
- define constant $underline = 4;
- define constant $outline = 8;
- define constant $shadow = 16;
- define constant $condense = 32;
- define constant $extend = 64;
-
- define class <window> (<object>)
- slot title :: <string>,
- required-init-keyword: title:,
- setter: %title-setter;
- slot bounds :: <vector>,
- required-init-keyword: bounds:,
- setter: %bounds-setter;
- slot visible :: <boolean>,
- init-value: #f,
- init-keyword: visible:,
- setter: %visible-setter;
- slot pen-size :: <vector>,
- init-value: #[1, 1],
- setter: %pen-size-setter;
- slot text-style,
- init-function: method() make(<text-style>) end,
- setter: %text-style-setter;
- slot updater :: <method>,
- init-value: #f,
- init-keyword: updater:;
- slot pointer :: union(<foreign-pointer>, singleton(#f));
- end class;
-
- // keep track of all windows in a hash table keyed on <foreign-pointer>.
- define constant *dylan-windows* = make(<table>);
-
- // a union type for methods that return a <window> or #f.
- define constant <window-or-false> = union(<window>, singleton(#f));
-
- define method initialize (self :: <window>, #key, #all-keys)
- next-method();
- self.pointer := %new-window(self.title, self.bounds, self.visible);
- *dylan-windows*[self.pointer] := self;
- end method;
-
- define method window-dispose (self :: <window>)
- if (self.pointer)
- *dylan-windows*[self.pointer] := #f;
- %dispose-window(self.pointer);
- self.pointer := #f;
- end if;
- end method;
-
- define method window-erase (self :: <window>)
- if (self.pointer)
- %erase-window(self.pointer);
- end if;
- end method;
-
- define method window-draw-line (self :: <window>, line :: <vector>)
- if (self.pointer)
- %draw-line(self.pointer, line);
- end if;
- end method;
-
- define method window-move-to (self :: <window>, x :: <small-integer>, y :: <small-integer>)
- if (self.pointer)
- %move-to(self.pointer, x, y);
- end if;
- end method;
-
- define method window-draw-string (self :: <window>, str :: <string>)
- if (self.pointer)
- %draw-string(self.pointer, str);
- end if;
- end method;
-
- define method front-window() => result :: <window-or-false>;
- let front-pointer = %front-window();
- if (front-pointer)
- *dylan-windows*[front-pointer];
- else
- #f;
- end if;
- end method;
-
- define method next-window(self :: <window>) => result :: <window-or-false>;
- let next-pointer = %next-window(self.pointer);
- if (next-pointer)
- *dylan-windows*[next-pointer];
- else
- #f;
- end if;
- end method;
-
- // setter of title slot, performs the low level retitle.
- define method title-setter(new-title :: <string>, self :: <window>)
- if (self.pointer)
- %title-setter(new-title, self);
- %set-window-title(self.pointer, new-title);
- end if;
- end method;
-
- // setter of bounds slot, performs the low level resize.
- define method bounds-setter(new-bounds :: <vector>, self :: <window>)
- if (self.pointer & new-bounds.size = 4)
- %bounds-setter(new-bounds, self); // actually sets the slot.
- %set-window-bounds(self.pointer, new-bounds);
- end if;
- end method;
-
- // setter of visible slot, performs visibility setting.
- define method visible-setter(vis :: <boolean>, self :: <window>)
- if (self.pointer & self.visible ~= vis)
- %visible-setter(vis, self); // actually sets the slot.
- if (vis)
- %show-window(self.pointer);
- else
- %hide-window(self.pointer);
- end if;
- end if;
- end method;
-
- // setter of pen-size slot, performs pen-size setting.
- define method pen-size-setter(new-pen-size :: <vector>, self :: <window>)
- if (self.pointer)
- %pen-size-setter(new-pen-size, self); // actually sets the slot.
- %set-pen-size(self.pointer, new-pen-size[0], new-pen-size[1]);
- end if;
- end method;
-
- // setter of text-style slot, performs pen-size setting.
- define method text-style-setter(new-text-style :: <text-style>, self :: <window>)
- if (self.pointer)
- %text-style-setter(new-text-style, self);
- %set-text-style(self.pointer, new-text-style);
- end if;
- end method;
-
- // private methods for handling window updates.
-
- define method dispatch-window-update (pointer :: <foreign-pointer>)
- let window = *dylan-windows*[pointer];
- if (window)
- // refresh the bounds.
- %bounds-setter(%get-window-bounds(pointer), window);
- if (window.updater)
- window.updater(window);
- end if;
- end if;
- end method;
-
- /*
- define variable *window* = make(<window>, title: "Graphics", bounds: #[50, 10, 250, 310]);
- *window*.visible := #t;
- *window*.visible := #f;
- *window*.updater := method(window :: <window>)
- window-erase(window);
- window-draw-line(window, #[0, 0, 200, 300]);
- window-draw-line(window, #[200, 0, 0, 300]);
- window-draw-line(window, #[100, 0, 100, 300]);
- window-draw-line(window, #[0, 150, 200, 150]);
- end method;
- *window*.visible := #t;
- window-dispose(*window*);
- */
-